package com.iapcursos.portal.procefet.controle;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.component.UISelectOne;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.servlet.ServletContext;

import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;

import com.iapcursos.portal.procefet.modelo.beans.entitys.Pessoa;
import com.iapcursos.portal.procefet.modelo.beans.entitys.Telefone;
import com.iapcursos.portal.procefet.modelo.beans.entitys.TipoTelefone;
import com.iapcursos.portal.procefet.modelo.beans.entitys.Turma;
import com.iapcursos.portal.procefet.modelo.beans.entitys.Unidade;
import com.iapcursos.portal.procefet.modelo.beans.sessions.interfaces.Sistema;
import com.iapcursos.portal.procefet.utils.FileUtils;

public class SMSPageBean {
	
	@EJB(mappedName="sistemaBean")
	private Sistema sistema;
	
	private Integer idTurma;
	private Integer idUnidade;
	private List<Turma> turmas;
	private List<Unidade> unidades;
	private String msg;
	private List<Pessoa> destinatarios;
	private List<Telefone> telefones = new ArrayList<Telefone>();
	
	private boolean mostraIMG = false;
	private boolean desabilitaSelTurma = false;
	private boolean desabilitaSelUnidade = false;
	private boolean desabilitaMsg = false;
	private boolean desabilitaBtEnviar = false;
	
	private String codigo;
	
	private MultiThreadedHttpConnectionManager connectionManager = 
		new MultiThreadedHttpConnectionManager();
	private HttpClient client = new HttpClient(connectionManager);	
	
	private static final String nomeArquivo = "captcha";
	private static final String extensaoArquivo = ".png";
	
	private String urlImage = "img/sms/captcha.png";
	
	private Random rand = new Random(1);
	
	public SMSPageBean() {
		
	}
	
	@SuppressWarnings("unused")
	@PostConstruct
	private void init(){
		this.unidades = this.sistema.recuperarUnidades();
		if(this.unidades.size()>0){
			this.turmas = this.unidades.get(0).getTurmas();
		}		
		
	}
	
	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public List<Turma> getTurmas() {
		return turmas;
	}

	public void setTurmas(List<Turma> turmas) {
		this.turmas = turmas;
	}

	public Integer getIdTurma() {
		return idTurma;
	}

	public void setIdTurma(Integer idTurma) {
		this.idTurma = idTurma;
	}
	
	public String recuperarImagemValidacao(){
		this.mostraIMG = true;
		InputStream is = this.getIMG();
		
		FacesContext context = FacesContext.getCurrentInstance();
		ServletContext servletContext = (ServletContext) context.getExternalContext().getContext();
				
		int n= rand.nextInt();
		
		String raiz = servletContext.getRealPath("/");
		File arquivoVelho = new File(raiz+this.urlImage);
		arquivoVelho.delete();
		
		String caminho = servletContext.getRealPath("img/sms/" )+File.separator+nomeArquivo+n+extensaoArquivo;
		this.urlImage = "img/sms/"+nomeArquivo+n+extensaoArquivo;
		
		System.out.println(caminho);
		FileUtils.inputStreamToFile(is, new File(caminho));
		
		
		this.desabilitaSelTurma = true;
		this.desabilitaSelUnidade = true;
		this.desabilitaMsg = true;
		this.desabilitaBtEnviar = true;
		
		this.destinatarios = this.sistema.getTurmaById(this.idTurma).getAlunos();
		this.popularListaTelefones(this.destinatarios);
		
		return null;
	}

	public String enviarMsg(){
		if(this.telefones.size()>0){
			NameValuePair[] params = { 
					new NameValuePair("captcha", this.codigo),
					new NameValuePair( "para_ddd", telefones.get(0).getDdd()+""),
					new NameValuePair( "para_numero", telefones.get(0).getNumero() ),
					new NameValuePair( "de_nome", "IAP Cursos" ),
					new NameValuePair( "mensagem", this.msg)
			};
			
			PostMethod post = new 
				PostMethod("http://torpedo.oiloja.com.br/wb/POi/POi_oi_torpedo_mundooi/");
			post.setRequestBody(params);	
						
			try {
				client.executeMethod(post);
				byte[] resposta = post.getResponseBody();
				String respostaS = (new String(resposta));
				if(respostaS.contains("Torpedo enviado com sucesso")){
					FacesContext.getCurrentInstance().addMessage
						(null, new FacesMessage("Torpedo enviado com sucesso"));
				}else if(respostaS.contains("corresponde<br>")){
					FacesContext.getCurrentInstance().addMessage
					(null, new FacesMessage(
							"O código informado não corresponde à imagem. Tente novamente"));
					this.recuperarNovaIMG();
					enviarMsg();					
				}

			} catch (HttpException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			this.telefones.remove(0);
			if(this.telefones.size()>0){
				this.recuperarNovaIMG();
				this.mostraIMG=true;
			}else{
				this.mostraIMG=false;
				this.habilitarFormNovaMsg();
			}
			
		}else{
			this.mostraIMG = false;
			this.habilitarFormNovaMsg();
		}
		return null;
	}
	
	public void recuperarNovaIMG(){
		this.mostraIMG = true;
		InputStream is = this.getIMG();
		
		FacesContext context = FacesContext.getCurrentInstance();
		ServletContext servletContext = (ServletContext) context.getExternalContext().getContext();
				
		int n= rand.nextInt();
		
		String raiz = servletContext.getRealPath("/");
		File arquivoVelho = new File(raiz+this.urlImage);
		arquivoVelho.delete();
		
		String caminho = servletContext.getRealPath("img/sms/" )+File.separator+nomeArquivo+n+extensaoArquivo;
		this.urlImage = "img/sms/"+nomeArquivo+n+extensaoArquivo;
		
		System.out.println(caminho);
		FileUtils.inputStreamToFile(is, new File(caminho));
	}

	private void popularListaTelefones(List<Pessoa> destinatarios) {
		//88,87,86
		for(Pessoa pessoa : this.sistema.getAllPessoas()/*destinatarios*/){
			for(Telefone tel : pessoa.getTelefones()){
				if(tel.getTipo().equals(TipoTelefone.CELULAR) && 
						(tel.getNumero().substring(0,2).equals("88") || 
								tel.getNumero().substring(0,2).equals("87") ||
								tel.getNumero().substring(0,2).equals("86"))){
					this.telefones.add(tel);
				}
			}
		}
		
	}
	
	public List<Unidade> getUnidades() {
		return unidades;
	}

	public void setUnidades(List<Unidade> unidades) {
		this.unidades = unidades;
	}

	public Integer getIdUnidade() {
		return idUnidade;
	}

	public void setIdUnidade(Integer idUnidade) {
		this.idUnidade = idUnidade;
	}
	
	public void popularTurmas(ValueChangeEvent anEvent) {
		UISelectOne sel = (UISelectOne) anEvent.getComponent();
		System.out.println(sel.getValue());
		this.turmas = this.sistema.getUnidadeById((Integer)sel.getValue()).getTurmas();
		
	}

	public boolean isMostraIMG() {
		return mostraIMG;
	}

	public void setMostraIMG(boolean mostraIMG) {
		this.mostraIMG = mostraIMG;
	}
	
	private InputStream getIMG(){
		//Prefixos oi 88,87,86
		HostConfiguration hostConfiguration = new HostConfiguration();
		hostConfiguration.setHost("torpedo.oiloja.com.br", 80);
		//clarotorpedoweb.claro.com.br
		GetMethod get = new GetMethod("http://torpedo.oiloja.com.br/captcha.jsp");
		get.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
		    		new DefaultHttpMethodRetryHandler(3, false));
		try {
			int statusCode = client.executeMethod(get);
			System.out.println("executou");
			if (statusCode != HttpStatus.SC_OK) {
			      System.out.println("Method failed: " + get.getStatusLine());
			}
			InputStream responseBody = get.getResponseBodyAsStream();
			return responseBody;
		} catch (HttpException e) {
			e.printStackTrace();
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	private void habilitarFormNovaMsg() {
		this.desabilitaSelTurma = false;
		this.desabilitaSelUnidade = false;
		this.desabilitaMsg = false;
		this.desabilitaBtEnviar = false;
		
	}
	
	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public static String getExtensaoArquivo() {
		return extensaoArquivo;
	}

	public String getUrlImage() {
		return urlImage;
	}

	public void setUrlImage(String urlImage) {
		this.urlImage = urlImage;
	}

	public boolean isHabilitaSelTurma() {
		return desabilitaSelTurma;
	}

	public void setHabilitaSelTurma(boolean habilitaSelTurma) {
		this.desabilitaSelTurma = habilitaSelTurma;
	}

	public boolean isHabilitaSelUnidade() {
		return desabilitaSelUnidade;
	}

	public void setHabilitaSelUnidade(boolean habilitaSelUnidade) {
		this.desabilitaSelUnidade = habilitaSelUnidade;
	}

	public boolean isHabilitaMsg() {
		return desabilitaMsg;
	}

	public void setHabilitaMsg(boolean habilitaMsg) {
		this.desabilitaMsg = habilitaMsg;
	}

	public boolean isHabilitaBtEnviar() {
		return desabilitaBtEnviar;
	}

	public void setHabilitaBtEnviar(boolean habilitaBtEnviar) {
		this.desabilitaBtEnviar = habilitaBtEnviar;
	}

	public boolean isDesabilitaSelTurma() {
		return desabilitaSelTurma;
	}

	public void setDesabilitaSelTurma(boolean desabilitaSelTurma) {
		this.desabilitaSelTurma = desabilitaSelTurma;
	}

	public boolean isDesabilitaSelUnidade() {
		return desabilitaSelUnidade;
	}

	public void setDesabilitaSelUnidade(boolean desabilitaSelUnidade) {
		this.desabilitaSelUnidade = desabilitaSelUnidade;
	}

	public boolean isDesabilitaMsg() {
		return desabilitaMsg;
	}

	public void setDesabilitaMsg(boolean desabilitaMsg) {
		this.desabilitaMsg = desabilitaMsg;
	}

	public boolean isDesabilitaBtEnviar() {
		return desabilitaBtEnviar;
	}

	public void setDesabilitaBtEnviar(boolean desabilitaBtEnviar) {
		this.desabilitaBtEnviar = desabilitaBtEnviar;
	}
	
}
